/*
 * WiFlyHQ Example httpclient.ino
 *
 * This sketch implements a simple Web client that connects to a 
 * web server, sends a GET, and then sends the result to the 
 * Serial monitor.
 *
 * This sketch is released to the public domain.
 *
 */

#include <WiFlyHQ.h>


#include <SoftwareSerial.h>
SoftwareSerial wifiSerial(11,12);

//#include <AltSoftSerial.h>
//AltSoftSerial wifiSerial(8,9);

WiFly wifly;


//Kva "pinner" styrer me ljosa med
int greenPin = 8; //Kun digital
int redPin = 10;
int bluePin = 9;

/* Change these to match your WiFi network */
const char mySSID[] = "myssid";
const char myPassword[] = "my-wpa-password";

const char site[] = "undertaket.no";

void terminal();

int runs = 0;

void setup()
{
  
  //Softpwm stuff
    // Initialize


  // Create and set pin 13 to 0 (off)


  // Set fade time for pin 13 to 100 ms fade-up time, and 500 ms fade-down time

  
  
  
    char buf[32];

    Serial.begin(115200);
    Serial.println("Starting");
    Serial.print("Free memory: ");
    Serial.println(wifly.getFreeMemory(),DEC);

    wifiSerial.begin(9600);
    if (!wifly.begin(&wifiSerial, &Serial)) {
        Serial.println("Failed to start wifly");
	terminal();
    }

    /* Join wifi network if not already associated */
    if (!wifly.isAssociated()) {
	/* Setup the WiFly to connect to a wifi network */
	Serial.println("Joining network");
	wifly.setSSID(mySSID);
	wifly.setPassphrase(myPassword);
	wifly.enableDHCP();

	if (wifly.join()) {
	    Serial.println("Joined wifi network");
	} else {
	    Serial.println("Failed to join wifi network");
	    terminal();
	}
    } else {
        Serial.println("Already joined network");
    }

    //terminal();

    Serial.print("MAC: ");
    Serial.println(wifly.getMAC(buf, sizeof(buf)));
    Serial.print("IP: ");
    Serial.println(wifly.getIP(buf, sizeof(buf)));
    Serial.print("Netmask: ");
    Serial.println(wifly.getNetmask(buf, sizeof(buf)));
    Serial.print("Gateway: ");
    Serial.println(wifly.getGateway(buf, sizeof(buf)));

    wifly.setDeviceID("Wifly-WebClient");
    Serial.print("DeviceID: ");
    Serial.println(wifly.getDeviceID(buf, sizeof(buf)));
    
    request();

   
}

void(* resetFunc) (void) = 0; //declare reset function @ address 0

void request(){
  if (wifly.isConnected()) {
        Serial.println("Old connection active. Closing");
	wifly.close(); //according to documentation this closes the connection, but the arduino cant get that informationz0r
        Serial.println("");
  }

    if (wifly.open(site, 80)) {
        //Serial.print("Connected to ");
	//Serial.println(site);

	/* Send the request */
	wifly.println("GET http://undertaket.no/demo/farge.php HTTP/1.0");
	wifly.println();
    } 
    else {
        Serial.println("Failed to connect");
        resetFunc();  //call reset
    } 
}

bool sentRequest = false;
bool finishedRecieving = false;

String line = "";





void loop()
{
      //Dersom det er noko på den raude chippen
     if (wifly.available() > 0) {
       //les bokstaver
	char ch = wifly.read();
        //Legg til bokstaver til linje
        line += ch;
	if (ch == '\n') {
          //Dersom linjeskift gjer linja clear linja
            line = "";
	}
        //dersom me finner ein alfakrøll på enden av linja så har me funne det me er på jakt etter
        if (ch == '@') {
          //Behandler linja og setter på ljosa
          processContent(line);
          runs++; 
          Serial.print("Runs : "); Serial.println(runs); //Debug for å finne ut kvifor det heile krasjer
          delay(25); //vent litt
          request(); //hent ny side
         }
    }
    
    if (Serial.available() > 0) {
	wifly.write(Serial.read());
    }
}


//Får inn ein streng type 64,128,255@
//strengen inneholder verdi for raud,grøn,blå
void processContent(String rgbValues){
    
  //Finner raud verdi i strengen ved å starte på posisjon 0, og slutte på først "," strengen
  String redS   = rgbValues.substring(0, rgbValues.indexOf(','));
  
  //Finner grøn verdi i strengen ved å starte på første "," + 1 og siste til siste komma
  String greenS = rgbValues.substring(rgbValues.indexOf(',')+1, rgbValues.lastIndexOf(','));
 
  //Finner blå verdi i strengen ved å starte på siste komma og slutte på på "@" -1
  String blueS  = rgbValues.substring(rgbValues.lastIndexOf(',')+1, rgbValues.length()-1);

  //Magiske funksjoner som gjer ein array av bokstaver om til eit tal
  int red   = intValue(redS);
  int green = intValue(greenS);
  int blue  = intValue(blueS);

  //Setter verdien av fargene våre på de respektive fysiske pinnene til arduinoen
  analogWrite(redPin, red);
  analogWrite(bluePin, blue);
  digitalWrite(greenPin, green > 128 ? HIGH : LOW);
  
}

//Magisk funksjon
int intValue(String s) {
  	char c[s.length()+1]; //lager ein char array klar for å halde på strengen vår 
	s.toCharArray(c, s.length()+1); //gjer om strengen til chararray (då mister me mykje funksjonalitet som er i strengbiblitoeket vårt
	int result = atoi(c); //magisk funksjon som tar innholdet i ein char array og gjer det om til ein int
	return result;
}

/* Connect the WiFly serial to the serial monitor. */
void terminal()
{
    while (1) {
	if (wifly.available() > 0) {
	    Serial.write(wifly.read());
	}


	if (Serial.available() > 0) {
	    wifly.write(Serial.read());
	}
    }
}
